package com.smart.community.region.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.region.dto.PropertyCompanyBuildingTypeDTO;
import com.smart.community.region.entity.PropertyCompanyBuildingType;
import com.smart.community.region.vo.PropertyCompanyBuildingTypeVO;

import java.util.List;

/**
 * 物业公司建筑类型Service接口
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 */
public interface IPropertyCompanyBuildingTypeService extends IService<PropertyCompanyBuildingType> {

    /**
     * 创建建筑类型
     * 
     * @param buildingTypeDTO 建筑类型DTO
     * @throws Exception 统一异常
     */
    void createBuildingType(PropertyCompanyBuildingTypeDTO buildingTypeDTO) throws Exception;

    /**
     * 批量创建建筑类型
     * 
     * @param buildingTypeDTOs 建筑类型DTO列表
     * @throws Exception 统一异常
     */
    void batchCreateBuildingType(List<PropertyCompanyBuildingTypeDTO> buildingTypeDTOs) throws Exception;

    /**
     * 获取物业公司建筑类型列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @param page 分页参数
     * @return 分页结果
     */
    IPage<PropertyCompanyBuildingTypeVO> getBuildingTypeList(Long propertyCompanyId, Page<PropertyCompanyBuildingTypeVO> page);

    /**
     * 根据条件分页查询建筑类型
     * 
     * @param propertyCompanyId 物业公司ID
     * @param buildingTypeName 建筑类型名称
     * @param buildingTypeCode 建筑类型编码
     * @param status 状态
     * @param page 分页参数
     * @return 分页结果
     */
    IPage<PropertyCompanyBuildingTypeVO> getBuildingTypeListByCondition(
        Long propertyCompanyId,
        String buildingTypeName,
        String buildingTypeCode,
        Integer status,
        Page<PropertyCompanyBuildingTypeVO> page
    );

    /**
     * 更新建筑类型
     * 
     * @param buildingTypeDTO 建筑类型DTO
     * @throws Exception 统一异常
     */
    void updateBuildingType(PropertyCompanyBuildingTypeDTO buildingTypeDTO) throws Exception;

    /**
     * 删除建筑类型
     * 
     * @param id 建筑类型ID
     * @throws Exception 统一异常
     */
    boolean deleteBuildingType(Long id) throws Exception;

    /**
     * 批量删除建筑类型
     * 
     * @param ids 建筑类型ID列表
     * @return 是否成功
     */
    boolean batchDeleteBuildingType(List<Long> ids);

    /**
     * 获取建筑类型详情
     * 
     * @param id 建筑类型ID
     * @return 建筑类型详情
     */
    PropertyCompanyBuildingTypeVO getBuildingTypeDetail(Long id);

    /**
     * 根据物业公司ID获取建筑类型列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 建筑类型列表
     */
    List<PropertyCompanyBuildingTypeVO> getBuildingTypesByPropertyCompanyId(Long propertyCompanyId);

    /**
     * 检查建筑类型编码是否重复
     * 
     * @param propertyCompanyId 物业公司ID
     * @param buildingTypeCode 建筑类型编码
     * @param excludeId 排除的ID
     * @return 是否重复
     */
    boolean isCodeDuplicate(Long propertyCompanyId, String buildingTypeCode, Long excludeId);

    /**
     * 分页查询平台公共建筑类型列表（不关联物业公司）
     * 
     * @param buildingTypeName 建筑类型名称
     * @param buildingTypeCode 建筑类型编码
     * @param status 状态
     * @param page 分页参数
     * @return 分页结果
     */
    IPage<PropertyCompanyBuildingTypeVO> getPublicBuildingTypeListByCondition(
        String buildingTypeName,
        String buildingTypeCode,
        Integer status,
        Page<PropertyCompanyBuildingTypeVO> page
    );

    /**
     * 获取平台公共建筑类型列表（不关联物业公司）
     * 
     * @return 建筑类型列表
     */
    List<PropertyCompanyBuildingTypeVO> getPublicBuildingTypes();
}
